#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>

pthread_mutex_t mutex;
void * func(void * arg){
  // 加锁，保证线程安全
  pthread_mutex_lock(&mutex);

  // 将传入的参数转换为 int 指针
   int * param =  (int*) arg;

  // 循环 100000 次，每次将参数值加 1
   for(int i = 0; i < 100000; i++){
        (*param) ++;
   }

  // 解锁
   pthread_mutex_unlock(&mutex);

  // 返回 NULL
    return NULL;
}

void * func2(void * arg){
    // 加锁
    pthread_mutex_lock(&mutex);

    // 将传入参数转换为整型指针
   int * param =  (int*) arg;

    // 循环增加参数值
   for(int i = 0; i < 100000; i++){
        (*param) ++;
   }

    // 解锁
   pthread_mutex_unlock(&mutex);

    // 返回空指针
    return NULL;
}

int main(){
    // 初始化互斥锁
    int res = pthread_mutex_init(&mutex, NULL);
    if(res){
        // 如果初始化失败，输出错误信息并退出程序
        perror("pthread_mutex_init error");
        exit(1);
    }

    int num = 0;
    pthread_t tid;
    // 创建第一个线程
    res  = pthread_create(&tid, NULL, func, &num);
    if(res){
        // 如果创建线程失败，输出错误信息并退出程序
        perror("pthread_create error");
        exit(1);
    }

    
    pthread_t tid2;
    int res2 = pthread_create(&tid2, NULL, func2, &num);
    if(res2){
        // 如果创建线程失败，输出错误信息并退出程序
        perror("pthread_create error");
        exit(1);
    }

    // 等待第一个线程结束
    pthread_join(tid, NULL);
    // 等待第二个线程结束
    pthread_join(tid2, NULL);

    // 输出最终的结果
    printf("num = %d\n", num);
    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);
    return 0;
}